//
// Author: Vladimir Migashko <migashko@gmail.com>, (C) 2011
//
// Copyright: See COPYING file that comes with this distribution
//

/**
  * Базовый аспект для json-rpc (объединяется со всеми аспектами использующие json-rpc),
  * включает адвайсы для замеров времени обработки команды (чтоб работала статистика по командам -  не реализованно )
  * и обработчик ошибок по умолчанию, который завершает соединение
  */

#ifndef MAMBA_SERVICE_ASPECT_JSON_ASPECT_HPP
#define MAMBA_SERVICE_ASPECT_JSON_ASPECT_HPP

#include <fas/adv/ad_cleaner.hpp>
#include <fas/adv/ad_clock.hpp>
#include <fas/adv/json_rpc3/aspect.hpp>
#include <fas/aop/aspect.hpp>
#include <vector>
#include "ad_exception.hpp"


namespace aa = ::fas::aop;
namespace ap = ::fas::pattern;
namespace ad = ::fas::adv;
namespace ajr = ::fas::adv::json_rpc3;

typedef aa::advice<
      aa::tag<ad::_clock_start_>,
      ad::ad_clock_start<void, void>
    >
clock_start_advice;

typedef aa::advice<
      aa::tag<ad::_clock_finish_>,
      ad::ad_clock_finish<>
    >
clock_finish_advice;

typedef aa::advice<
     aa::tag_list_n< ajr::_invalid_json_, ajr::_unknown_method_ >::type,
     ad_exception
    >
json_exception_advice;

///  Не используется по умолчанию, может включаться в аспект вместо json_exception_advice
typedef aa::advice<
     aa::tag_list_n< ajr::_invalid_json_, ajr::_unknown_method_ >::type,
     ad::ad_stub<>
    >
json_exception_advice_empty;


typedef ap::type_list_n<
  clock_start_advice,
  clock_finish_advice,
  json_exception_advice
>::type json_advice_list;

typedef aa::aspect<json_advice_list> json_aspect_base;

typedef aa::aspect_merge< ajr::aspect, json_aspect_base>::type json_aspect;


#endif
